<?php

namespace Fendx\Db;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
use Doctrine\ORM\Events;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Doctrine\ORM\Event\PreFlushEventArgs;
use Doctrine\ORM\Event\PostFlushEventArgs;

class DoctrineListener implements EventSubscriber
{
    public function getSubscribedEvents()
    {
        return array(
            Events::prePersist,
            Events::postPersist,
            Events::preUpdate,
            Events::postUpdate,
            Events::preFlush,
            Events::postFlush,
            Events::postLoad,
            Events::loadClassMetadata,
            Events::onClear,
        );
    }



    public function postLoad(LifecycleEventArgs $args) {


//        var_dump('postLoad');
//        var_dump($args->getEntity());

        //debug open will record more
        if (\Fendx\Debug::isDebug()) {

            //debug Info collect
            $debugInfo = [];
            //$debugInfo['mode'] = '';
            $debugInfo['sql'] = $args->getObjectManager()->getMetadataFactory()->getAllMetadata();
            $debugInfo['info'] = [$bindparam];
            $debugInfo['time'] = round(microtime(true) - $startTime, 4);
//
//            //if have explain
//            $explain = array();
//            if ($query && preg_match("/^(select )/i", $sql)) {
//                $qs = $this->queryWithRetry('EXPLAIN ' . $sql, $bindparam);
//                while ($rs = $this->fetch($qs)) {
//                    $explain[] = $rs;
//                }
//
//                if (!empty($explain)) {
//                    $debugInfo['explain'] = $explain;
//                }
//            }
//
//            //record sql info
//            \Fendx\Debug::appendSqlInfo($debugInfo);
        }

    }

    public function loadClassMetadata(LoadClassMetadataEventArgs $args) {
        var_dump('loadClassMetadata');
        var_dump($args->getClassMetadata()->getTableName());


        $startTime     = microtime(true);
//        $eagleeyeParam = array(
//            "x_name"          => "mysql.request",
//            "x_host"          => '',
//            "x_module"        => "php_mysql_query",
//            "x_instance_name" => $args->getClassMetadata()->getSchemaName(),
//            "x_file"          => __FILE__,
//            "x_line"          => __LINE__,
//            "x_action"        => $sql,
//            "x_param"         => @json_encode($args->getClassMetadata()->getSqlResultSetMappings())
//        );
    }

    public function onClear() {
        var_dump('onClear');
    }

    public function prePersist(LifecycleEventArgs $args)
    {
        //插入数据库前
        var_dump('prePersist');

    }

    public function postPersist(LifecycleEventArgs $args)
    {
        //插入数据库后
        var_dump('postPersist');

    }

    public function preUpdate(PreUpdateEventArgs $args)
    {
        //修改数据库之前
        $entity = $args->getEntity();
//        //判断Entity类型
//        if($entity instanceof XxInterface){
//            //跟原始数据差异，更改了哪些字段
//            //$charged = ['title' => ['old title', 'new title']]
//            $changed = $args->getEntityChangeSet();
//            //根据修改值，进行其它操作
//        }
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        //修改数据库后
    }

    public function preFlush(PreFlushEventArgs $args)
    {
        var_dump('preFlush');

        //保存数据库之前
        //注：经测试，在 prePersist后/preUpdate前，很诡异
    }

    public function postFlush(PostFlushEventArgs $args)
    {
        var_dump('postFlush');

        //保存数据库后 在 postPersist/postUpdate 后
    }
}
